home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 October / pcx14_9710.iso / swag / delphi.swg / 0209_Re: Calculating Credit Cards.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-03-04  |  2.8 KB  |  99 lines

  1. {
  2. >I only have one credit card, a visa, and the code works right for it.
  3. >So I'm sending this to the list for two purposes, to share this with
  4. >everyone and to get anybody else who finds it useful to take a look at
  5. >it and see if it's running right for other card types (and to catch any
  6. >dumb mistakes I've committed).
  7.  
  8. Your code is probably working fine, I didn't look at it, but I thought
  9. I'd post you some code I've used in applications since Turbo Pascal
  10. 3.0 and it's worked like a champ... although a little dated in structure.
  11. It also returns the card type--Visa, MC, Amex or Discover.
  12. }
  13.  
  14. FUNCTION VALIDCCARD(A:STRING):BOOLEAN;
  15. VAR C:CHAR;
  16.     T:WORD;
  17.     X,M,N:BYTE;
  18.   BEGIN
  19.     VALIDCCARD:=FALSE;
  20.     A:=NUMBERS(A);
  21.     IF A[0]<#4 THEN EXIT;
  22.     C:=A[LENGTH(A)];
  23.     DEC(A[0]);
  24.     M:=2;
  25.     T:=0;
  26.     FOR X:=LENGTH(A) DOWNTO 1 DO
  27.       BEGIN
  28.         N:=(BYTE(A[X])-48);
  29.         N:=N*M;
  30.         IF N>9
  31.           THEN BEGIN
  32.                  N:=N-10;
  33.                  INC(T);
  34.                END;
  35.         T:=T+N;
  36.         M:=3-M;
  37.       END;
  38.     T:=(TRUNC((T+9)/10)*10)-T;
  39.     IF T=(BYTE(C)-48) THEN VALIDCCARD:=TRUE;
  40.   END;
  41.  
  42. FUNCTION  NUMBERS(C:STRING):STRING;
  43. VAR A:STRING;
  44.     X:INTEGER;
  45.   BEGIN {strips out all non-numeric digits from a string}
  46.     A:='';
  47.     IF LENGTH(C)>0 THEN FOR X:=1 TO LENGTH(C) DO
  48.       IF C[X] IN ['0'..'9'] THEN A:=A+C[X];
  49.     NUMBERS:=A;
  50.   END;
  51.  
  52. FUNCTION VALOF(CONST A:STRING):LONGINT;
  53. VAR I:INTEGER;
  54.     L:COMP;
  55.   BEGIN {guarantee no crash VAL function}
  56.     VAL(A,L,I);
  57.     IF I<>0 THEN L:=0;
  58.     IF L>HIGH(LONGINT) THEN L:=HIGH(LONGINT);
  59.     IF L<LOW(LONGINT) THEN L:=LOW(LONGINT);
  60.     VALOF:=TRUNC(L);
  61.   END;
  62.  
  63. FUNCTION CCARDTYPE(A:STRING):BYTE;
  64. {returns
  65.   0:invalid credit card type
  66.   1:VISA
  67.   2:MC
  68.   3:American Express
  69.   4:Discover
  70.   5:Unknown type}
  71. VAR W:LONGINT;
  72.   BEGIN
  73.     A:=NUMBERS(A);
  74.     IF VALIDCCARD(A)
  75.       THEN BEGIN
  76.              W:=VALOF(COPY(A,1,6));
  77.              IF (W>=510000) AND (W<=559999) AND (BYTE(A[0])=16)
  78.                THEN CCARDTYPE:=2 {Mastercard}
  79.                ELSE
  80.              IF (W>=400000) AND (W<=499999) AND (BYTE(A[0])=13)
  81.                THEN CCARDTYPE:=1 {VISA}
  82.                ELSE
  83.              IF (W>=400000) AND (W<=499999) AND (BYTE(A[0])=16)
  84.                THEN CCARDTYPE:=1 {VISA}
  85.                ELSE
  86.              IF (W>=340000) AND (W<=349999) AND (BYTE(A[0])=15)
  87.                THEN CCARDTYPE:=3 {American Express}
  88.                ELSE
  89.              IF (W>=370000) AND (W<=379999) AND (BYTE(A[0])=15)
  90.                THEN CCARDTYPE:=3 {American Express}
  91.                ELSE
  92.              IF (W>=601100) AND (W<=601199) AND (BYTE(A[0])=16)
  93.                THEN CCARDTYPE:=4 {Discover}
  94.                ELSE CCARDTYPE:=5;{Unknown type}
  95.            END
  96.       ELSE CCARDTYPE:=0;
  97.   END;
  98.  
  99.